package com.example.common.exception;

/**
 * 系统错误码枚举
 * - 系统级错误：500-599
 * - 客户端错误：400-499
 * - 业务错误：按模块划分，1000-9999
 *   - 用户模块：1000-1099
 *   - 订单模块：1100-1199
 *   - 支付模块：1200-1299
 */
public enum ErrorCode {
    // 系统级错误 (500-599)
    SYSTEM_ERROR(500, "系统内部错误，请联系管理员"),
    SERVICE_UNAVAILABLE(503, "服务不可用"),
    DATABASE_ERROR(501, "数据库操作异常"),
    
    // 客户端错误 (400-499)
    INVALID_PARAMETER(400, "无效的参数"),
    VALIDATION_ERROR(400, "参数验证失败"),
    REQUEST_FORMAT_ERROR(400, "请求格式错误"),
    NULL_POINTER_ERROR(400, "请求参数错误"),
    UNAUTHORIZED(401, "未授权的访问"),
    FORBIDDEN(403, "禁止访问"),
    NOT_FOUND(404, "资源不存在"),
    
    // 用户相关错误 (1000-1099)
    USER_NOT_FOUND(1000, "用户不存在"),
    USER_ALREADY_EXISTS(1001, "用户已存在"),
    USERNAME_INVALID(1002, "用户名无效"),
    PASSWORD_INVALID(1003, "密码无效"),
    ACCOUNT_LOCKED(1004, "账号已锁定"),
    
    // 订单相关错误 (1100-1199)
    ORDER_NOT_FOUND(1100, "订单不存在"),
    ORDER_ALREADY_PAID(1101, "订单已支付"),
    ORDER_EXPIRED(1102, "订单已过期");

    private final int code;
    private final String message;

    ErrorCode(int code, String message) {
        this.code = code;
        this.message = message;
    }

    public int getCode() {
        return code;
    }

    public String getMessage() {
        return message;
    }

    /**
     * 根据错误码获取对应的ErrorCode枚举
     * @param code 错误码
     * @return 对应的ErrorCode枚举，如果不存在则返回SYSTEM_ERROR
     */
    public static ErrorCode fromCode(int code) {
        for (ErrorCode errorCode : values()) {
            if (errorCode.getCode() == code) {
                return errorCode;
            }
        }
        return SYSTEM_ERROR; // 默认返回系统错误
    }
} 